﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AccesoBD;
using Entidades;
using System.Text.RegularExpressions;

namespace PresentacionEscritorio
{
    public partial class frmRegistrarUsuario : Form
    {
        public Usuario user { get; set; }
        public enum estado
        {
            NuevoUsuario, NuevaContraseña
        }
        estado oE = estado.NuevoUsuario;
        public frmRegistrarUsuario()
        {
            InitializeComponent();
        }
        public frmRegistrarUsuario(Usuario us)
        {
            InitializeComponent();
            user = us;
        }

        private void frmUsuario_Load(object sender, EventArgs e)
        {
            txtContraseñaAnterior.Visible = false;
            lblContraseñaAnterior.Visible = false;
            txtContraseñaNueva.Visible = false;
            lblContraseñaNueva.Visible = false;
            lblDescripcionContraseña.Visible = false;
            cargarEmpleados();
            cargarMedicos();
            cargarRoles();
            if (user != null)
            {

                oE = estado.NuevaContraseña;
                deshabilitarPaneles();
                txtContraseñaNueva.Enabled = true;
                txtContraseñaNueva.ReadOnly = false;
                txtContraseñaAnterior.Visible = true;
                lblContraseñaAnterior.Visible = true;
                txtContraseñaNueva.Visible = true;
                lblContraseñaNueva.Visible = true;
                if (user.legajoEmpleado != 0)
                {
                    Empleado oEmp = Empleados.ObtenerEmpleadoPorUsuario(user.CodUsuario);
                    cmbEmpleados.Text = oEmp.NombreYApellido;
                    txtUsuario.Text = user.Nombre;
                    cmbRol.Text = user.NombreRol;
                    txtContraseñaAnterior.Text = user.Contraseña;
                }
                if (user.legajoMedico != 0)
                {
                    cmbEmpleados.Text = "";
                    Medico oM = Medicos.obtenerMedicoPorUsuario(user.CodUsuario);
                    cmbMedicos.Text = oM.ApellidoNombre;
                    txtUsuario.Text = user.Nombre;
                    cmbRol.Text = user.NombreRol;
                    txtContraseñaAnterior.Text = user.Contraseña;
                }
            }

        }
        private void deshabilitarPaneles()
        {
            foreach (Control item in pnlAsignarUser.Controls)
            {

                if (item is TextBox)
                {
                    TextBox c = (TextBox)item;
                    c.ReadOnly = true;
                }

                else if (item is Label)
                {
                    item.Enabled = true;
                }
                else
                {
                    item.Enabled = false;
                }

            }
            foreach (Control item in panelDatosUser.Controls)
            {

                if (item is TextBox)
                {
                    TextBox c = (TextBox)item;
                    c.ReadOnly = true;
                }

                else if (item is Label)
                {
                    item.Enabled = true;
                }
                else
                {
                    item.Enabled = false;
                }

            }


        }
        private void cargarEmpleados()
        {
            List<Empleado> lsEm = Empleados.obtenerTodosActivos();
            cmbEmpleados.DataSource = lsEm;
            cmbEmpleados.DisplayMember = "NombreYApellido";
            cmbEmpleados.ValueMember = "Legajo";
        }

        private void cargarMedicos()
        {
            List<Medico> lM = Medicos.obtenerTodosMedicosNombres();
            cmbMedicos.DataSource = lM;
            cmbMedicos.DisplayMember = "ApellidoNombre";
            cmbMedicos.ValueMember = "legajo";
        }
        private void cargarRoles()
        {
            List<Rol> lsRol = Roles.obtenerTodos();
            cmbRol.DataSource = lsRol;
            cmbRol.DisplayMember = "nombre";
            cmbRol.ValueMember = "idRol";


        }
        private void btnCrearMedico_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            frmRegistrarProfesional formRegProf = new frmRegistrarProfesional();
            formRegProf.setOpcion("Usuario"); //esta es una opcion especial para que el form sepa que me tiene que devolver el médico que creó
            formRegProf.Show();
        }

        private void btnCrearEmpleado_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            //abrir el form de registrar empleado
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            //validar();
            if (oE == estado.NuevoUsuario)
            {
                Usuario nU = new Usuario();


                if (rdbEmpleado.Checked == true)
                {
                    Empleado oEmp = (Empleado)cmbEmpleados.SelectedItem;



                    if (validar(oEmp.Legajo, oEmp.NombreYApellido, 1))
                    {
                        nU.legajoEmpleado = oEmp.Legajo;
                        nU.Contraseña = oEmp.NroDocumento.ToString();
                        nU.FechaAlta = DateTime.Now;
                        nU.Nombre = txtUsuario.Text;
                        nU.IdRol = int.Parse(cmbRol.SelectedValue.ToString());
                        bool re = Usuarios.registrarAltaUsuario(nU);
                        if (re == true)
                        {
                            MessageBox.Show("Se registro con exito el Usuario:" + txtUsuario.Text, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            this.Close();
                        }
                    }
                }
                if (rdbMedico.Checked == true)
                {
                    Medico oM = (Medico)cmbMedicos.SelectedItem;


                    if (validar(oM.Legajo, oM.ApellidoNombre, 2))
                    {
                        nU.Contraseña = oM.NroDocumento.ToString();
                        nU.FechaAlta = DateTime.Now;
                        nU.Nombre = txtUsuario.Text;
                        nU.IdRol = int.Parse(cmbRol.SelectedValue.ToString());
                        nU.legajoMedico = oM.Legajo;
                        bool re = Usuarios.registrarAltaUsuario(nU);
                        if (re == true)
                        {
                            MessageBox.Show("Se registro con exito el Usuario:" + txtUsuario.Text, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            
                        }
                    }
                }

            }//fin if
            if (oE == estado.NuevaContraseña)
            {
                if (validarContraseñaNueva())
                {
                    txtContraseñaNueva.Enabled = true;
                    user.Contraseña = txtContraseñaNueva.Text;
                    bool res = (Usuarios.actualizarContraseña(user));
                    if (res == true)
                    {
                        MessageBox.Show("Se actualizo con exito la contraseña del usuario:" + txtUsuario.Text, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);
                       

                    }
                }

            }

        }
        private void limpiar()
        {
            txtUsuario.Text = "";
            txtContraseñaNueva.Text = "";
            txtContraseñaAnterior.Text = "";
        }
        private bool validar(long legajo, string nombre, int tipo)
        {
            string error = "";
            bool validar = true;

            if (string.IsNullOrEmpty(txtUsuario.Text))
            {
                error += "Debe ingresar nombre de usuario" + "\n";
                validar = false;
            }
            if (validarDuplicadoDeNombreUsuario())
            {
                error += "Ya existe el nombre de usuario" + "\n";
                validar = false;
            }
            if (tipo == 1)
            {
                if (validarExistenciaUserEmpleado(legajo))
                {
                    error += "Ya existe existe usuario ceado para: " + nombre + "/ legajo: " + legajo + "\n";
                    validar = false;
                }
            }
            if (tipo == 2)
            {
                if (validarExistenciaUserMedico(legajo))
                {
                    error += "Ya existe existe usuario ceado para: " + nombre + "/ legajo: " + legajo + "\n";
                    validar = false;
                }
            }

            if (cmbRol.SelectedIndex == -1)
            {
                error += "Debe seleccionar Rol";
                validar = false;

            }



            if (error != "")
            {
                MessageBox.Show(error, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

            return validar;
        }
        private bool validarDuplicadoDeNombreUsuario()
        {
            string nombreUr = txtUsuario.Text;

            return Usuarios.validarDuplicadoNombreUsr(nombreUr);

        }
        private bool validarContraseñaNueva()
        {
            string error = "";
            bool validar = true;
            Regex val = new Regex(@"^[A-Z0-9 a-z]*$");
            Regex num = new Regex(@"^[0-9]+$");
            Regex letras = new Regex(@"^[A-Za-z ]+$");

            if (string.IsNullOrEmpty(txtContraseñaNueva.Text) || txtContraseñaNueva.TextLength < 4 || txtContraseñaNueva.TextLength > 16)
            {
                error += "Debe ingresar la contraseña con un maximo de 16 caracteres y un minimo de 4";
                validar = false;
            }
            if (!val.IsMatch(txtContraseñaNueva.Text))
            {
                error += "La cadena no tiene el formato correcto";
                validar = false;
            }
            if (num.IsMatch(txtContraseñaNueva.Text) || letras.IsMatch(txtContraseñaNueva.Text))
            {
                error += "La contraseña debe contener numeros y letras";
                validar = false;
            }
            if (error != "")
            {
                MessageBox.Show(error, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            return validar;
        }
        private bool validarExistenciaUserMedico(long legajo)
        {
            return Usuarios.validarExistenciaDeUsuarioMEdico(legajo);
        }
        private bool validarExistenciaUserEmpleado(long legajo)
        {
            return Usuarios.validarExistenciaDeUsuarioEmpleado(legajo);
        }
        private void rdbEmpleado_CheckedChanged(object sender, EventArgs e)
        {
            if (rdbEmpleado.Checked)
            {
                cmbEmpleados.Enabled = true;
                btnCrearEmpleado.Enabled = true;
                cmbMedicos.Enabled = false;
                btnCrearMedico.Enabled = false;
            }
        }

        private void rdbMedico_CheckedChanged(object sender, EventArgs e)
        {
            if (rdbMedico.Checked)
            {
                cmbEmpleados.Enabled = false;
                btnCrearEmpleado.Enabled = false;
                cmbMedicos.Enabled = true;
                btnCrearMedico.Enabled = true;
            }

        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
